package com.chisheng.caa.pojo;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import org.springframework.util.Assert;

import java.util.Arrays;
import java.util.Objects;
import java.util.Optional;

/**
 * 冲突处理策略
 */
public enum DuplicateStrategy implements ValueDesc {

    /**
     * 不允许重复。
     */
    NOT_ALLOWED(0, "不允许重复"),

    /**
     * 属性向前合并。源 Bean 中的值为 null 时才从目标 Bean 中取值。
     */
    FORWARD_INTEGRATION(1, "属性向前合并"),

    /**
     * 属性向后合并。将目标 Bean 中所有非 null 值复制到源 Bean 中。
     */
    BACKWARD_INTEGRATION(2, "属性向后合并"),

    /**
     * 忽略重复。
     */
    DO_NOT_CARE(3, "忽略重复");

    /**
     * 序列化值
     */
    private final Integer value;

    /**
     * 描述信息
     */
    private final String desc;

    DuplicateStrategy(Integer value, String desc) {
        this.value = value;
        this.desc = Objects.requireNonNull(desc);
    }

    @JsonValue
    @Override
    public Integer getValue() {
        return value;
    }

    @Override
    public String getDesc() {
        return desc;
    }

    @JsonCreator
    public static DuplicateStrategy valueOf(int value) {
        Optional<DuplicateStrategy> strategy = Arrays.stream(DuplicateStrategy.values())
                .filter(e -> e.value == value)
                .findFirst();

        Assert.isTrue(strategy.isPresent(), String.format("参数 'value' 无效的取值 '%d'", value));
        return strategy.get();
    }

}
